package Day_0203.MYSQL;

/**
 * @author zxc
 * @date 2023/02/03 22:15
 **/
public class Transaction_Isolation_Level {
    public static void main(String[] args) {
        /**
         * 事务隔离级别
         * ===》
         * SQL 标准定义了四个隔离级别 ：
         * 1.READ-UNCOMMITTED(读取未提交)：
         * 最低的隔离级别，允许读取尚未提交的数据变更，可能会导致脏读、幻读或不可重复读。
         * 也就是说，该级别会对于所要修改的数据加上X锁（排他锁），解决了丢失修改问题;
         *
         * 2.READ-COMMITTED(读取已提交)：
         * 允许读取并发事务已经提交的数据，可以阻止脏读，但是幻读或不可重复读仍有可能发生。
         *
         * 3.REPEATABLE-READ(可重复读)：
         * 对同一字段的多次读取结果都是一致的，除非数据是被本身事务自己所修改，可以阻止脏读和不可重复读，但幻读仍有可能发生。
         *
         * 4.SERIALIZABLE(可串行化)：
         * 最高的隔离级别，完全服从ACID的隔离级别。所有的事务依次逐个执行，这样事务之间就完全不可能产生干扰，
         * 也就是说，该级别可以防止脏读、不可重复读以及幻读。
         *
         */

        /**
         * InnoDB存储引擎所使用的事务隔离级别，默认为 REPEATABLE-READ(可重复读)
         * ===》
         * 与 SQL 标准不同的地方在于
         * （1）InnoDB 存储引擎在 REPEATABLE-READ（可重读） 事务隔离级别下使用的是Next-Key Lock 锁（间隙锁）算法;
         *  因此可以避免幻读的产生，这与其他数据库系统(如 SQL Server) 是不同的。
         *
         * （2）所以说InnoDB 存储引擎的默认支持的隔离级别是 REPEATABLE-READ（可重读） 已经可以完全保证事务的隔离性要求，
         *  即，达到了 SQL标准的 SERIALIZABLE(可串行化) 隔离级别。
         *
         * （3）因为隔离级别越低，事务请求的锁越少，所以大部分数据库系统的隔离级别都是READ-COMMITTED(读取提交内容) ，
         *  但是你要知道的是InnoDB 存储引擎默认使用REPEAaTABLE-READ（可重读） 并不会有任何性能损失。
         *
         * （4）InnoDB 存储引擎在 分布式事务 的情况下一般会用到 SERIALIZABLE(可串行化) 隔离级别。
         *
         */
    }
}
